package com.zoro.interviewee.conc;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * @author zhaoxingwu
 */
public class CyclicBarrierTest {

    public static void main(String[] args) throws InterruptedException {

        final int times = 5;

        CyclicBarrier cb = new CyclicBarrier(times, () -> {

            System.out.println("完成了");
        });

        for (int i = 0; i < times*2; i++) {
            MyThread mt = new MyThread(cb, i + 1);
            mt.start();
        }
    }

}

class MyThread extends Thread {

    private final CyclicBarrier barrier;
    private final int sleepSecond;

    MyThread(CyclicBarrier barrier, int sleepSecond) {
        this.barrier = barrier;
        this.sleepSecond = sleepSecond;
    }


    @Override
    public void run() {

        try {

            System.out.printf("线程：%s 启动, %s 秒后进入每一步 %n", getName(), sleepSecond);
            TimeUnit.SECONDS.sleep(this.sleepSecond);
            System.out.printf("线程：%s sleep over %n", getName());

            // 如果一个线程到达这行，而其他线程没有，那么到达的线程会阻塞在这里，直到其他线程都完成，再继续，
            // 注意，这里不是等待所有线程，是指定个数的线程到达这里后，就会向下进行，没有到达这个的线程在其他线程执行到这一行之后完成，那么这些迟到的进程会卡在 await这一行，直到够数为止
            //
            this.barrier.await();
            System.out.printf("线程：%s 过第1阶段；%n", getName());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
